﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.Linq;
using WebArchivosTelefonica.Jerarquias;
using System.Drawing;

namespace WebArchivosTelefonica
{
    /// <summary>
    /// Control que sube los archivos
    /// </summary>
    public partial class ArchivosUpload : System.Web.UI.UserControl
    {
        #region CAMPOS

        /// <summary>
        /// Administrador de la aplicación
        /// </summary>
        private IAdministrador _administrador;
        /// <summary>
        /// Id de la carpeta base del administrador
        /// </summary>
        private Guid _idCarpetaBase;
        /// <summary>
        /// Id de la carpeta de otros documentos
        /// </summary>
        private Guid _idCarpetaOtros;
        /// <summary>
        /// Data source de los otros documentos
        /// </summary>
        private LinqDataSource _linqDataSourceDocumentos;
        /// <summary>
        /// 
        /// </summary>
        private int _indicePagina;
        /// <summary>
        /// 
        /// </summary>
        private Object _dataSourceDocumentos;
        /// <summary>
        /// 
        /// </summary>
        public event EventHandler Carga;
        /// <summary>
        /// 
        /// </summary>
        public event EventHandler Prueba;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        public virtual void OnCarga(EventArgs e)
        {
            if (Carga != null)
                Carga(this, e);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        public virtual void OnPrueba(EventArgs e)
        {
            if (Prueba != null)
                Prueba(this, e);
        }

        //int _indicePagina;



        #endregion

        #region PROPIEDADES

        /// <summary>
        /// GET/SET Administrador de la aplicacion
        /// </summary>
        public IAdministrador Administrador
        {
            get { return _administrador; }
            set { _administrador = value; }
        }

        /// <summary>
        /// get/set DataSource de el listado de archivos
        /// </summary>
        public Object DataSourceDocumentos
        {
            get
            {
                return _dataSourceDocumentos;
            }
            set
            {
                _dataSourceDocumentos = value;
                listadoArchivos.DataSource = _dataSourceDocumentos;
                listadoArchivos.DataBind();
                
                ConfigurarVisualizacionCheckBox();
            }
        }
        /// <summary>
        /// GET/SET Id de carpeta base
        /// </summary>
        public Guid IdCarpetaBase
        {
            get { return _idCarpetaBase; }
            set
            {
                _idCarpetaBase = value;
                
                ObtenerDataSourceControl();
                if (_idCarpetaBase == new Guid())
                {
                    DibujarControles(false);
                }
                else
                {
                    DibujarControles(true);
                }
            }
        }

        private void ObtenerDataSourceControl()
        {
            if (_administrador != null)
            {
                DataSourceDocumentos = _administrador.GetDataSourceDocumentosRoles(_idCarpetaBase);
                _idCarpetaOtros = _administrador.GetIdCarpetaHijaByName(_idCarpetaBase, "Otros");
                ViewState["IdCarpetaOtros"] = _idCarpetaOtros;
                ViewState["IdCarpetaBase"] = _idCarpetaBase;
                ObtenerDataSourceOtrosDocumentos();
                
            }
        }

        #endregion

        #region METODOS PROTECTED

        /// <summary>
        /// Page load de la pagina
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            

            if (IsPostBack)
            {
                _idCarpetaBase = (Guid)ViewState["IdCarpetaBase"];
                _idCarpetaOtros = (Guid)ViewState["IdCarpetaOtros"];
                _indicePagina = (int)ViewState["IndicePagina"];
            }
            else
            {
                _idCarpetaOtros = new Guid();
                _idCarpetaBase = new Guid();
                ViewState["IdCarpetaOtros"] = _idCarpetaOtros;
                ViewState["IdCarpetaBase"] = _idCarpetaBase;
                ViewState["IndicePagina"] = _indicePagina;

            }


        }
        /// <summary>
        /// Método que configura la habilitaciòn y el color como se muestran los checkbox
        /// </summary>
        private void ConfigurarVisualizacionCheckBox()
        {
            foreach (RepeaterItem documento in listadoArchivos.Items)
            {

                HiddenField campoIdDocumento = (HiddenField)(documento.FindControl("hiddenIdDocumento"));
                Guid idDocumento = new Guid(campoIdDocumento.Value);
                IEntidadLinqDocumento documentoModificado = _administrador.GetDocumentoById(idDocumento);


                CheckBox checkBoxRevisadoTes = (CheckBox)(documento.FindControl("_checkBoxRevisadoTes"));
                CheckBox checkBoxAprobadoTes = (CheckBox)(documento.FindControl("_checkBoxAprobadoTes"));
                CheckBox checkBoxRevisadoCliente = (CheckBox)(documento.FindControl("_checkBoxRevisadoCliente"));
                CheckBox checkBoxAprobadoCliente = (CheckBox)(documento.FindControl("_checkBoxAprobadoCliente"));

                CheckBox checkBoxReRevisadoTes = (CheckBox)(documento.FindControl("_checkBoxReRevisadoTes"));
                CheckBox checkBoxReAprobadoTes = (CheckBox)(documento.FindControl("_checkBoxReAprobadoTes"));
                CheckBox checkBoxReRevisadoCliente = (CheckBox)(documento.FindControl("_checkBoxReRevisadoCliente"));
                CheckBox checkBoxReAprobadoCliente = (CheckBox)(documento.FindControl("_checkBoxReAprobadoCliente"));
                //El revisor tes solo necesita que el archivo exista. Todos los otros roles deben poder 
                //cambiar el estado de su revision solo si el estado anterior fue chequeado. Asi rechaze

                checkBoxRevisadoTes.Enabled = Roles.IsUserInRole("Revisor TES")
                                                          && documentoModificado.ExisteDocumento;
                checkBoxReRevisadoTes.Enabled = Roles.IsUserInRole("Revisor TES")
                                                          && documentoModificado.ExisteDocumento;

                checkBoxAprobadoTes.Enabled = Roles.IsUserInRole("Aprobador TES")
                                                            && (documentoModificado.IdEstadoDocumento == 2
																				|| documentoModificado.IdEstadoDocumento == 3
                                                            || documentoModificado.IdEstadoDocumento == 7);
                checkBoxReAprobadoTes.Enabled = Roles.IsUserInRole("Aprobador TES")
                                                            && (documentoModificado.IdEstadoDocumento == 2
																				|| documentoModificado.IdEstadoDocumento == 3
                                                            || documentoModificado.IdEstadoDocumento == 7);

                checkBoxRevisadoCliente.Enabled = Roles.IsUserInRole("Revisor Cliente")
                                                            && (documentoModificado.IdEstadoDocumento == 3
																				|| documentoModificado.IdEstadoDocumento == 4
                                                            || documentoModificado.IdEstadoDocumento == 8);
                checkBoxReRevisadoCliente.Enabled = Roles.IsUserInRole("Revisor Cliente")
                                                            && (documentoModificado.IdEstadoDocumento == 3
																				|| documentoModificado.IdEstadoDocumento == 4	
																				|| documentoModificado.IdEstadoDocumento == 8);

                checkBoxAprobadoCliente.Enabled = Roles.IsUserInRole("Aprobador Cliente")
                                                            && (documentoModificado.IdEstadoDocumento == 4
                                                            || documentoModificado.IdEstadoDocumento == 5
                                                            || documentoModificado.IdEstadoDocumento == 9);
                checkBoxReAprobadoCliente.Enabled = Roles.IsUserInRole("Aprobador Cliente")
                                                            && (documentoModificado.IdEstadoDocumento == 4
                                                            || documentoModificado.IdEstadoDocumento == 5
                                                            || documentoModificado.IdEstadoDocumento == 9);

            }
        }


        /// <summary>
        /// Sobrecarga del OnInit
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {

            base.OnInit(e);
            _idCarpetaOtros = new Guid();
            _idCarpetaBase = new Guid();
            ViewState["IdCarpetaOtros"] = _idCarpetaOtros;
            ViewState["IdCarpetaBase"] = _idCarpetaBase;
            ViewState["IndicePagina"] = _indicePagina;
            OnCarga(e);
        }

        /// <summary>
        /// Boton que sube los archivos 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void botonSubirArchivos_Click(object sender, EventArgs e)
        {
            foreach (RepeaterItem documento in listadoArchivos.Items)
            {
                FileUpload fileUploadDocumento = (FileUpload)(documento.FindControl("fileUploadArchivo"));
                HiddenField campoIdDocumento = (HiddenField)(documento.FindControl("hiddenIdDocumento"));
                TextBox textoComentarios = (TextBox)(documento.FindControl("TextBoxComentarios"));

                Guid idDocumento = new Guid(campoIdDocumento.Value);
                IEntidadLinqDocumento documentoModificado = _administrador.GetDocumentoById(idDocumento);
                if (fileUploadDocumento != null)
                {

                    documentoModificado.Fecha = DateTime.Now;
                    if (fileUploadDocumento != null && fileUploadDocumento.HasFile)
                    {
                        Binary archivo = new Binary(fileUploadDocumento.FileBytes);
                        documentoModificado.Archivo = archivo;
                        documentoModificado.Nombre = fileUploadDocumento.FileName;
                    }
                }
                documentoModificado.Descripcion = textoComentarios.Text;

                //LoginView loginViewRevisorTes = (LoginView)(documento.FindControl("_loginViewRevisorTes"));
                //LoginView loginViewAprobadorTes = (LoginView)(documento.FindControl("_loginViewAprobadorTes"));
                //LoginView loginViewRevisorCliente = (LoginView)(documento.FindControl("_loginViewRevisorCliente"));
                //LoginView loginViewAprobadorCliente = (LoginView)(documento.FindControl("_loginViewAprobadorCliente"));
                CheckBox checkBoxRevisadoTes = (CheckBox)(documento.FindControl("_checkBoxRevisadoTes"));
                CheckBox checkBoxAprobadoTes = (CheckBox)(documento.FindControl("_checkBoxAprobadoTes"));
                CheckBox checkBoxRevisadoCliente = (CheckBox)(documento.FindControl("_checkBoxRevisadoCliente"));
                CheckBox checkBoxAprobadoCliente = (CheckBox)(documento.FindControl("_checkBoxAprobadoCliente"));

                CheckBox checkBoxReRevisadoTes = (CheckBox)(documento.FindControl("_checkBoxReRevisadoTes"));
                CheckBox checkBoxReAprobadoTes = (CheckBox)(documento.FindControl("_checkBoxReAprobadoTes"));
                CheckBox checkBoxReRevisadoCliente = (CheckBox)(documento.FindControl("_checkBoxReRevisadoCliente"));
                CheckBox checkBoxReAprobadoCliente = (CheckBox)(documento.FindControl("_checkBoxReAprobadoCliente"));

                int idEstadoInicial = documentoModificado.IdEstadoDocumento;
                switch (idEstadoInicial)
                {
                    case 0:
                        if (fileUploadDocumento != null && fileUploadDocumento.HasFile)
                            documentoModificado.IdEstadoDocumento = 1;
                        break;
                    case 1:
                        if (checkBoxRevisadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 2;
                        }
                        else if (checkBoxReRevisadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 6;
                        }
                        break;
                    case 2:
                        if (checkBoxReAprobadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 7;
                        }
                        else if (checkBoxAprobadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 3;
                        }
                        break;
                    case 3:
                        if (checkBoxReRevisadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 8;
                        }
                        else if (checkBoxRevisadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 4;
                        }
                        break;
                    case 4:
                        if (checkBoxReAprobadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 9;
                        }
                        else if (checkBoxAprobadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 5;
                        }
                        break;
                    case 5:
                        break;
                    case 6:
                        if (fileUploadDocumento != null && fileUploadDocumento.HasFile)
                            documentoModificado.IdEstadoDocumento = 1;
                        break;
                    case 7:
                        if (checkBoxRevisadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 2;
                        }
                        if (checkBoxReRevisadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 6;
                        }
                        break;

                    case 8:
                        if (checkBoxAprobadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 3;
                        }
                        if (checkBoxReAprobadoTes.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 7;
                        }
                        break;
                    case 9:
                        if (checkBoxRevisadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 4;
                        }
                        if (checkBoxReRevisadoCliente.Checked)
                        {
                            documentoModificado.IdEstadoDocumento = 8;
                        }
                        break;
                    default:
                        break;
                }

                // Se mira en orden los checks seleccionados en caso de que se den multiples permisos a algun
                // usuario

                //primero los checks de revision tes
                if (checkBoxRevisadoTes.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 2;
                }
                if (checkBoxReRevisadoTes.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 6;
                }

                //segundo checks de aprobacion tes
                if (checkBoxAprobadoTes.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 3;
                }
                if (checkBoxReAprobadoTes.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 7;

                }

                //tercero revision cliente
                if (checkBoxRevisadoCliente.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 4;
                }

                if (checkBoxReRevisadoCliente.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 8;
                }


                //ultimo aprobacion cliente
                if (checkBoxAprobadoCliente.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 5;
                }

                if (checkBoxReAprobadoCliente.Checked)
                {
                    documentoModificado.IdEstadoDocumento = 9;
                }

            }
            _administrador.AplicarCambios();
            if (fileUploadOtrosArchivos.HasFile)
            {
                string comentarios = TextBoxComentariosOtros.Text;
                FabricaObjetosLinqJerarquiaDocumentos fabricaDocumento = new FabricaObjetosLinqJerarquiaDocumentos();
                System.Data.Linq.Binary archivo = new System.Data.Linq.Binary(fileUploadOtrosArchivos.FileBytes);
                _administrador.UploadDocumento(fileUploadOtrosArchivos.FileName, archivo, comentarios, _idCarpetaOtros, fabricaDocumento);
            }
            ObtenerDataSourceControl();
            OnPrueba(new EventArgs());
        }


        #endregion

        #region METODOS PRIVATE

        /// <summary>
        /// Visualiza o no los controles de otros documentos si el data source es nulo
        /// </summary>
        private void DibujarControles(bool estado)
        {

            labelOtros.Visible = estado;
            fileUploadOtrosArchivos.Visible = estado;
            botonSubirArchivos.Visible = estado;
            GridViewArchivosOtros.Visible = estado;
            TextBoxComentariosOtros.Visible = estado;

        }

        /// <summary>
        /// Obtiene el DataSource de otros documentos que esten en la carpeta base
        /// </summary>
        private void ObtenerDataSourceOtrosDocumentos()
        {

            GridViewArchivosOtros.DataSource = null;
            if (_administrador != null)
            {
                LinqDataSourceAdp adaptadorDataSourceDocumentos = new LinqDataSourceAdp();
                adaptadorDataSourceDocumentos = (LinqDataSourceAdp)(_administrador.GetDataSourceDocumentos(_idCarpetaOtros));
                _linqDataSourceDocumentos = adaptadorDataSourceDocumentos.GetLinqDataSource();
                GridViewArchivosOtros.DataSource = _linqDataSourceDocumentos;
            }
            GridViewArchivosOtros.DataBind();

        }

        #endregion

        /// <summary>
        /// Método para bajar un archivo 
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        protected void listadoArchivos_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "Descargar")
            {

                HiddenField campoIdDocumento = (HiddenField)(e.Item.FindControl("hiddenIdDocumento"));
                Guid idDocumento = new Guid(campoIdDocumento.Value);

                IEntidadLinqDocumento documento = _administrador.GetDocumentoById(idDocumento);


                if (documento != null)
                {
                    string fileName = documento.Nombre;

                    Response.Clear();
                    //Response.ContentType = "image/jpeg";

                    //ExtractorContentType.GetContentType(Path.GetFileName(fileName));
                    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
                    Response.BinaryWrite(documento.Archivo.ToArray());
                    Response.End();
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Descargar")
            {
                int a = 0;
                int.TryParse(e.CommandArgument.ToString(), out a);
                Guid idDocumento = new Guid(GridViewArchivosOtros.DataKeys[a].Value.ToString());
                IEntidadLinqDocumento documento = _administrador.GetDocumentoById(idDocumento);
                if (documento != null)
                {
                    string fileName = documento.Nombre;
                    Response.Clear();
                    //Response.ContentType = "image/jpeg";
                    //ExtractorContentType.GetContentType(Path.GetFileName(fileName));
                    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
                    Response.BinaryWrite(documento.Archivo.ToArray());
                    Response.End();
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_PageIndexChanged(object sender, EventArgs e)
        {
            //ObtenerDataSourceOtrosDocumentos();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_PageIndexChanged1(object sender, EventArgs e)
        {
            ObtenerDataSourceOtrosDocumentos();
            
            GridViewArchivosOtros.PageIndex = _indicePagina;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            ObtenerDataSourceOtrosDocumentos();
            
            _indicePagina = e.NewPageIndex;
            ViewState["IndicePagina"] = _indicePagina;
            GridViewArchivosOtros.PageIndex = _indicePagina;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_Init(object sender, EventArgs e)
        {
            ObtenerDataSourceOtrosDocumentos();
            
            GridViewArchivosOtros.PageIndex = _indicePagina;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewArchivosOtros_Load(object sender, EventArgs e)
        {
            ObtenerDataSourceOtrosDocumentos();
            
            GridViewArchivosOtros.PageIndex = _indicePagina;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {

        }




    }
}
